package main

import "fmt"

// 申请多个全局变量，在函数体外部
var (
	variablesx int
	slicex     []int
	interfacex interface{}
)

func main() {
	//handle_vari()
	handle_cons()
}

/**
变量
*/
func handle_vari() {
	//赋值
	var variables0 int = 1
	var variables0_0 string = "helloworld"
	var variables0_1 float64 = 3.14
	var variables0_2 bool = true
	fmt.Println(variables0, variables0_0, variables0_1, variables0_2)

	// 不赋值 有默认的零值
	var variables1 int
	fmt.Println(variables1)

	// 简短声明
	variables2 := 2
	fmt.Println(variables2)

	// 这种情况，编译器自动做类型推导
	var variables3 = 100
	fmt.Println(variables3)

	// 一次赋值多个值
	var variables4, variables5, variables6, variables7 = 1, "helloworld", 3.14, true
	fmt.Println(variables4, variables5, variables6, variables7)

	// 简短声明，多次赋值
	variables8, variables9, variables10, variables11 := 1, "helloworld", 3.14, true
	fmt.Println(variables8, variables9, variables10, variables11)

	// 变量 交换
	var i = 100
	var j = 200
	fmt.Println(i, j)
	i, j = j, i
	fmt.Println(i, j)

	// 下划线_ 是个特殊的变量名，任何赋予它的值都会被丢弃
	variables12, _ := "variables12", "remove"
	fmt.Println(variables12)

	// 对于已声明未使用的变量会在编译阶段报错,如果一个变量暂时不使用，可以赋值给他自己
	var index int
	index = index
}

/**
常量
*/
func handle_cons() {
	// 应用场景，数据不发生变化时
	// 枚举数据时
	const (
		Monday = iota
		Tuesday
		Wednesday
		Thursday
		Friday
		Saturday
		Sunday
	)
	fmt.Println(Monday, Tuesday, Wednesday, Thursday, Friday)

	const constVariables0 float64 = 3.1415926
	fmt.Println(constVariables0)

	// 一次申明多个值
	const constVariables1, constVariables2 = 100, "helloworld"
	fmt.Println(constVariables1, constVariables2)

	// 单独赋值
	const constVariables3 = iota //0
	const constVariables4 = iota //0
	fmt.Println(constVariables3, constVariables4)

}
